class Vue {
	constructor (options) {
		// 1. 接收初始化的参数
		this.$option = options || {}
		this.$data = options.data || {}
		this.$el = typeof options.el === 'string' ? document.querySelector(options.el) : options.el
		// 2. 把data中的属性注入到Vue实例，转换成getter/setter
		this._proxyData(this.$data)
		// 3. 调用observe监听data中所有属性的变化
		new Observer(this.$data)
		// 4. 调用compiler 解析指令/差值表达式
		new Compiler(this)
		
	}
	
	_proxyData (data) {
		// 遍历data中的所有属性
		Object.keys(data).forEach(key => {
			// 把data的属性注入到Vue实例
			Object.defineProperty(this, key, {
				enumerable: true,
				configurable: true,
				get () {
					return data[key]
				},
				set (newValue) {
					if (newValue === data[key]){
						return 
					}
					data[key] = newValue
				}
			})
			
		})
		
	}

	set (target, key, val) {
		 new Observer.set(target, key, val)
	}
}